Window Functions SQL এ একটি শক্তিশালী ফিচার যা একাধিক রেকর্ডের মধ্যে নির্দিষ্ট নিয়মে বিশ্লেষণ করতে সহায়তা করে। এগুলো সাধারণত OVER() ক্লজ ব্যবহার করে পরিচালিত হয় এবং বিভিন্ন রেকর্ডের মধ্যে ক্যালকুলেশন বা পারফরম্যান্স নির্ধারণ করতে ব্যবহৃত হয়।
এসব ফাংশন ডেটার কোন নির্দিষ্ট সারণী বা পার্টিশনে কাজ করে এবং একই সাথে রেকর্ডগুলোর অবস্থান বা স্থান অনুসারে গাণিতিক/স্ট্যাটিস্টিক্যাল বিশ্লেষণ করতে সহায়তা করে।
এখানে চারটি গুরুত্বপূর্ণ Window Function আলোচনা করা হচ্ছে:
- ROW_NUMBER()
- RANK()
- LEAD()
- LAG()
1. ROW_NUMBER()
ROW_NUMBER() ফাংশনটি রেকর্ডগুলোর মধ্যে প্রতিটি রেকর্ডকে একটি অনন্য সিরিয়াল নম্বর (row number) অ্যাসাইন করে, যা সারণীতে নির্দিষ্ট ক্রম অনুসারে প্রদর্শিত হয়। এটি সাধারণত রেকর্ডের স্থান নির্ধারণের জন্য ব্যবহৃত হয়।
সিনট্যাক্স:
SELECT column1, column2, ROW_NUMBER() OVER (ORDER BY column_name) AS row_num
FROM table_name;
- ROW_NUMBER() ফাংশনটি কেবল রেকর্ডের অবস্থান বা সিরিয়াল নম্বর প্রদানের জন্য ব্যবহৃত হয়, এবং এর মাধ্যমে একই মানের জন্য আলাদা সিরিয়াল নম্বর তৈরি হয়।
উদাহরণ:
ধরা যাক, একটি Sales টেবিল রয়েছে এবং আমরা বিক্রেতাদের নামের ভিত্তিতে প্রতিটি রেকর্ডের জন্য একটি সিরিয়াল নম্বর তৈরি করতে চাই।
SELECT sales_rep, sales_amount, ROW_NUMBER() OVER (ORDER BY sales_amount DESC) AS row_num
FROM Sales;
এটি sales_amount কলামের ভিত্তিতে একটি সিরিয়াল নম্বর তৈরি করবে, এবং যে রেকর্ডটির সর্বোচ্চ বিক্রয় হবে সেটি প্রথমে থাকবে।
2. RANK()
RANK() ফাংশনটি ROW_NUMBER() এর মতো কাজ করে, তবে এটি দুটি বা তার বেশি একীভূত মানের জন্য একই র্যাঙ্ক (rank) প্রদান করে। RANK() ফাংশন একক মানের জন্য একটি বিশেষ র্যাঙ্ক প্রদান করে, কিন্তু যদি একাধিক রেকর্ড একই মানের হয়, তবে তাদের সবাইকে একই র্যাঙ্ক দেওয়া হয় এবং পরবর্তী র্যাঙ্কটি একাধিক ধাপ এগিয়ে চলে।
সিনট্যাক্স:
SELECT column1, column2, RANK() OVER (ORDER BY column_name) AS rank
FROM table_name;
উদাহরণ:
ধরা যাক, আমাদের একটি Employees টেবিল রয়েছে এবং আমরা তাদের বেতন অনুযায়ী র্যাঙ্ক করতে চাই।
SELECT employee_name, salary, RANK() OVER (ORDER BY salary DESC) AS rank
FROM Employees;
এটি কর্মীদের বেতন অনুযায়ী তাদের র্যাঙ্ক প্রদান করবে। যদি দুটি কর্মীর বেতন সমান থাকে, তাদের উভয়ের জন্য একই র্যাঙ্ক হবে, এবং পরবর্তী র্যাঙ্কটি দুটি ধাপ এগিয়ে থাকবে।
3. LEAD()
LEAD() ফাংশনটি বর্তমান রেকর্ডের পরবর্তী রেকর্ডের মান দেখানোর জন্য ব্যবহৃত হয়। এটি মূলত কোন কলামের মানের পরবর্তী রেকর্ডের সাথে তুলনা করতে সাহায্য করে এবং এটি কেবল ফলস্বরূপে ব্যবহৃত হয় যেখানে পরবর্তী রেকর্ডের ডেটা প্রয়োজন হয়।
সিনট্যাক্স:
SELECT column1, column2, LEAD(column_name, 1) OVER (ORDER BY column_name) AS next_value
FROM table_name;
- LEAD() ফাংশনটি বর্তমান রেকর্ডের পরবর্তী রেকর্ডের মান ফিরিয়ে দেয়, এবং এখানে দ্বিতীয় আর্গুমেন্ট 1 দ্বারা পরবর্তী রেকর্ড নির্দেশ করা হয়েছে।
উদাহরণ:
ধরা যাক, আমাদের একটি Sales টেবিল রয়েছে এবং আমরা প্রতিটি বিক্রেতার বিক্রয় পরিমাণ এবং তাদের পরবর্তী বিক্রয় পরিমাণ দেখতে চাই।
SELECT sales_rep, sales_amount, LEAD(sales_amount, 1) OVER (ORDER BY sales_date) AS next_sales
FROM Sales;
এটি sales_amount কলামের বর্তমান মানের পাশাপাশি পরবর্তী রেকর্ডের sales_amount দেখাবে, যা বিক্রয়ের পরবর্তী তারিখের উপর ভিত্তি করে।
4. LAG()
LAG() ফাংশনটি LEAD() এর বিপরীত কাজ করে, অর্থাৎ এটি বর্তমান রেকর্ডের পূর্ববর্তী রেকর্ডের মান দেখানোর জন্য ব্যবহৃত হয়। এটি মূলত কোনো রেকর্ডের আগের রেকর্ডের তথ্য দেখতে সাহায্য করে।
সিনট্যাক্স:
SELECT column1, column2, LAG(column_name, 1) OVER (ORDER BY column_name) AS previous_value
FROM table_name;
- LAG() ফাংশনটি বর্তমান রেকর্ডের পূর্ববর্তী রেকর্ডের মান ফিরিয়ে দেয়, এবং দ্বিতীয় আর্গুমেন্ট 1 দ্বারা পূর্ববর্তী রেকর্ড নির্দেশ করা হয়েছে।
উদাহরণ:
ধরা যাক, আমাদের একটি Sales টেবিল রয়েছে এবং আমরা প্রতিটি বিক্রেতার বিক্রয় পরিমাণ এবং তাদের পূর্ববর্তী বিক্রয় পরিমাণ দেখতে চাই।
SELECT sales_rep, sales_amount, LAG(sales_amount, 1) OVER (ORDER BY sales_date) AS previous_sales
FROM Sales;
এটি sales_amount কলামের বর্তমান মানের পাশাপাশি পূর্ববর্তী রেকর্ডের sales_amount দেখাবে, যা বিক্রয়ের আগের তারিখের উপর ভিত্তি করে।
সারাংশ
- ROW_NUMBER(): প্রতিটি রেকর্ডের জন্য একটি অনন্য সিরিয়াল নম্বর প্রদান করে।
- RANK(): একাধিক সমান মানের জন্য একই র্যাঙ্ক প্রদান করে এবং পরবর্তী র্যাঙ্কটি ধাপে এগিয়ে চলে।
- LEAD(): বর্তমান রেকর্ডের পরবর্তী রেকর্ডের মান দেখায়।
- LAG(): বর্তমান রেকর্ডের পূর্ববর্তী রেকর্ডের মান দেখায়।
এই window functions SQL এ ডেটার বিশ্লেষণ এবং রিপোর্ট তৈরির জন্য শক্তিশালী টুল হিসেবে কাজ করে, বিশেষত যখন আপনাকে একাধিক রেকর্ডের মধ্যে সম্পর্ক নির্ধারণ করতে হয় বা ট্রেন্ড ও পারফরম্যান্স বিশ্লেষণ করতে হয়।
Read more